﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using LojaVirtual.Comuns.Produtos;
using LojaVirtual.Infra;
using LojaWeb.Models;
using LojaWeb.Areas.Admin.ViewModels;
using System.IO;

namespace LojaWeb.Areas.Admin.Controllers
{
    [Authorize]
    public class ProdutoController : Controller
    {
		private UnitOfWork db;

		public ProdutoController()
		{
			db = new UnitOfWork();
		}

        // GET: /Admin/Produto/
        public ViewResult Index()
        {
			var produtos = db.Produtos.Recuperar();

            return View(produtos);
        }


        // GET: /Admin/Produto/Details/5
        public ViewResult Details(int id)
        {
			Produto produto = db.Produtos.Recuperar(id);
			var model = new ProdutoViewModel();
			model.Produto = produto;

            return View(model);
        }

        // GET: /Admin/Produto/Create
        public ActionResult Create()
        {
			PopulatePedidoDropDownList();
            return View();
        }

		private void PopulatePedidoDropDownList(object categoriaSelecionada = null)
		{
			var categorias = db.Categorias.Recuperar().OrderBy(i => i.Nome);
			ViewBag.CategoriaID = new SelectList(categorias, "ID", "Nome", categoriaSelecionada);
		}

        // POST: /Admin/Produto/Create
        [HttpPost]
		public ActionResult Create(ProdutoViewModel model, int? categoriaID)
        {
			if (!categoriaID.HasValue)
				ModelState.AddModelError("categoriaID", "Selecione uma categoria");

            if (ModelState.IsValid)
            {
				var categoria = db.Categorias.Recuperar(categoriaID.Value);
				model.Produto.Categoria = categoria;

				if (model.Foto != null && model.Foto.ContentLength > 0)
				{
					model.Produto.Foto = SalvarImagem(model);
				}

				db.Produtos.Inserir(model.Produto);
				db.SalvarAlteracoes();
                return RedirectToAction("Index");  
            }
			PopulatePedidoDropDownList();
            return View(model);
        }

		private string SalvarImagem(ProdutoViewModel model)
		{
			int random = new Random().Next(1000, int.MaxValue);
			string extensao = Path.GetExtension(model.Foto.FileName);

			string nomeArquivo = string.Format("{0}_{1}{2}", model.Produto.Nome, random, extensao);

			
			string path = Path.Combine(Server.MapPath("~/Content/produtos/"), nomeArquivo);
			model.Foto.SaveAs(path);

			return nomeArquivo;
		}
        
        // GET: /Admin/Produto/Edit/5
        public ActionResult Edit(int id)
        {
			Produto produto = db.Produtos.Recuperar(id);
			var model = new ProdutoViewModel();
			model.Produto = produto;

			PopulatePedidoDropDownList(model.Produto.Categoria.ID);

            return View(model);
        }

        // POST: /Admin/Produto/Edit/5
        [HttpPost]
		public ActionResult Edit(ProdutoViewModel model, int? categoriaID)
        {
			
			if (!categoriaID.HasValue)
				ModelState.AddModelError("categoriaID", "Selecione uma categoria");

            if (ModelState.IsValid)
            {
				var categoria = db.Categorias.Recuperar(categoriaID.Value);
				var produto = db.Produtos.Recuperar(model.Produto.ID);

				if(produto.Categoria != categoria)
					produto.Categoria = categoria;

				if (model.Foto != null && model.Foto.ContentLength > 0)
				{
					produto.Foto = SalvarImagem(model);
				}

				db.Produtos.Atualizar(produto);
				db.SalvarAlteracoes();
                return RedirectToAction("Index");
            }
            return View(model.Produto);
        }

		public ActionResult RemoverFotoProduto(int id)
		{
			Produto produto = db.Produtos.Recuperar(id);
			RemoverArquivoFoto(produto);
			db.Produtos.Atualizar(produto);
			db.SalvarAlteracoes();

			return RedirectToAction("Edit", new { id = id });
		}

		private void RemoverArquivoFoto(Produto produto)
		{
			string path = Path.Combine(Server.MapPath("~/Content/produtos/"), produto.Foto);
			if (System.IO.File.Exists(path))
			{
				System.IO.File.Delete(path);
			}
			produto.Foto = null;
		}

        // GET: /Admin/Produto/Delete/5
        public ActionResult Delete(int id)
        {
			Produto produto = db.Produtos.Recuperar(id);
            return View(produto);
        }

        // POST: /Admin/Produto/Delete/5
        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {
			var produto = db.Produtos.Recuperar(id);
			RemoverArquivoFoto(produto);

			db.Produtos.Delete(id);
			db.SalvarAlteracoes();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
			db.Dispose();
            base.Dispose(disposing);
        }
    }
}